class Transformer(nn.Module):
    def __init__(self):
        super(Transformer, self).__init__()
        self.encoder = Encoder().to(device)
        self.decoder = Decoder().to(device)
        self.projection = nn.Linear(d_model,tgt_vocab_size,bias=False).to(device)
        # 对decoder的输出转换维度,
        # 从隐藏层维数转化为英语单词词典大小（选取概率最大的,作为预测结果）
    def forward(self, enc_inputs, dec_inputs):
        '''
        enc_inputs维度：[batch_size, src_len]
        对encoder-input,一个batch有几个sequence,一个sequence有几个字
        dec_inputs: [batch_size, tgt_len]
        对decoder-input,一个batch有几个sequence,一个sequence有几个字
        '''  
         memory = enc_outputs = self.encoder(enc_inputs)
        # enc_outputs: [batch_size, src_len, d_model],
        # d_model是每一个字的word embedding长度
        # 在PyTorch中的Transformer使用memory这个名字

        dec_outputs=self.decoder(dec_inputs,enc_inputs,enc_outputs)
        # dec_outpus: [batch_size, tgt_len, d_model],
        dec_logits = self.projection(dec_outputs)
        # 从[batch_size, tgt_len, d_model]变成 [batch_size, tgt_len, tgt_vocab_size]
        # dec_logits: [batch_size, tgt_len, tgt_vocab_size]
        return dec_logits.view(-1, dec_logits.size(-1))
